| [u][b]id[/b][/u] | [u][b]num[/b][/u] |
+-----+-----+
| 5 | 1 |
+-----+-----+
| 6 | 2 |
+-----+-----+
num is unique
אני מציג למשתמש את הטבלה כדי שיבחר אילו שינויים לבצע והוא עורך את הטבלה ומגיש את הטופס.
עכשיו במקרה שלדוגמה לשורה הראשונה הוא נתן num=6 ולשורה השנייה נתן num=5, השאילתה שהסקריפט יוצר תהיה כזו:
עכשיו הבעיה עם השאילתה היא שהיא נותנת שגיאה כי ברגע שהסקריפט מעדכן את השורה הראשונה ושם בה 6 יש בעיה, כי num הוא unique ואז יש התנגשות עם ה-num של השורה השנייה ומוחזרת שגיאה.
יש דרך לפתור את זה בלי הרבה שאילתות?
13 תשובות
הטבלה:
| id | num |
+-----+-----+
| 1 | 5 |
+-----+-----+
| 2 | 6 |
+-----+-----+
num is unique
קודם למחוק מהטבלה את הערכים שהוא שינה ואז להכניס אותם מחדש.
תעשה את זה בטראנזקציה, ככה שאם אחד ה num לא יהיה יוניקי - ישארו לך הערכים הישנים ותוכל לתת על זה הודעת שגיאה.
הבעיה היא שה-id מכוון ל-auto increment וכשאני מכניס id ידנית זה דופק את זה וה-id שיכנס אחריו יהיה לא בסדר הנכון..
זה כן.
הייתה לי טבלה עם שתי שורות, ה-idים הם 1 ו-2, כשהכנסתי שורה חדשה עם id=6, השורה הבאה שהכנסתי הייתה עם id=7.
וכן, נכון שאין בעיה עם חורים ב-id.
בכל מקרה מחקתי את ה-unique, הוא אמנם יכול לעזור במקרים מסוימים, אבל גם אם יהיו שתי שורות עם אותו ערך בעמודה הזו הסקריפט יתמודד. זה עדיף לי במקרה הזה.
תודה רבה. :)
תנסה שוב. auto_increment לא עולה עם אתה מכניס ערך שהוא יותר נמוך מה auto_increment הבא.
כן, נכון, טעיתי אתה צודק. :)
בכל מקרה זה כבר לא משנה כי ביטלתי את ה-unique.
אבל זה עדיף על פני הרבה שאילתות update...
הטבלה שלי מכילה יותר עמודות, לכן אני צריך:
1. שאילתת select ששולפת את יתר העמודות.
2. שאילתת delete.
3. שאילתת insert.
בכל מקרה דיברתי על ה-update שעשיתי בהתחלה ושהוא עדיף על פני הרבה updateים.
אני אעשה יותר מאוחר בדיקה כדי לראות מה יותר כדאי, 3 שאילתות; select, delete, insert או שאילתת update עם הרבה caseים.
תנאים כאלה ממש לא רצויים בשאילתות. צריך לעשות הפרדה בין ה"שכבות הלוגיות" מה שנקרא. אין לזה השפעה ממשית במקרה של משהו נקודתי, ואם אין מערכים גדולים, אבל זה כן יכול להשפיע במקרה ויש לך הרבה מידע והרבה מניפולציות עליו. כמו כן, זה הופך את הקוד לפחות גמיש. זה גם יכול ליצור בעיות תאימות בין מסדים. לכן זה באמת רעיון לא טוב.
עברתי ל-select, delete ו-insert.
תודה רבה. :)